package com.wwu.schedule.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.util.StringUtils;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;

/**
 * @author 一蓑烟雨
 * @version 1.0.0
 * @date 2023-04-15 12:07
 **/
@Configuration
public class ThreadPoolConfig {
    /** 获取当前系统CPU数目 */
    private static int cpuNums = Runtime.getRuntime().availableProcessors();
    /** 核心线程数(线程池维护线程的最少数量),默认为1 */
    @Value("${schedule.pool.corePoolSize:1}")
    private String corePoolSize;
    /** 最大线程数(线程池维护线程的最大数量),默认为1 */
    @Value("${schedule.pool.maxPoolSize:1}")
    private String maxPoolSize;
    /** 线程池所使用的缓冲队列长度(大于等于最大线程),默认为1 */
    @Value("${schedule.pool.queueCapacity:1}")
    private String queueCapacity;
    /** 设置空闲线程最大存活时间(超出核心线程数量的线程回收),默认为60秒 */
    @Value("${schedule.pool.KeepAliveSeconds:60}")
    private String KeepAliveSeconds;

    @Bean
    public Executor taskExecutor() {
        System.out.println("...获取当前系统CPU数目:"+cpuNums);
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        //设置核心线程数：没有配置或配置为空时则为1;配置为-1时则取系统CPU数目的2倍加1
        executor.setCorePoolSize(!StringUtils.hasLength(corePoolSize)
                ? 1 : (corePoolSize.equals("-1") ? cpuNums*2+1 : Integer.parseInt(corePoolSize)));
        //设置最大线程数：没有配置或配置为空时则为1;配置为-1时则取系统CPU数目的3倍
        executor.setMaxPoolSize(!StringUtils.hasLength(maxPoolSize)
                ? 1 : (maxPoolSize.equals("-1") ? cpuNums*3 : Integer.parseInt(maxPoolSize)));
        //设置线程池队列长度：没有配置或配置为空时则为1;配置为-1时则取系统CPU数目的3倍
        executor.setQueueCapacity(!StringUtils.hasLength(queueCapacity)
                ? 1 : (queueCapacity.equals("-1") ? cpuNums*3 : Integer.parseInt(queueCapacity)));
        //设置空闲线程最大存活时间：没有配置、配置为空或-1时则为60;
        executor.setKeepAliveSeconds(!StringUtils.hasLength(KeepAliveSeconds)||KeepAliveSeconds.equals("-1")
                ? 60 : Integer.parseInt(KeepAliveSeconds));
        //设置空闲线程回收策略：false表示当线程数达到核心线程时就不再回收，true表示空闲线程回收直到线程数为0
        executor.setAllowCoreThreadTimeOut(false);
        //线程池拒绝策略
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        //设置线程名称前缀
        executor.setThreadNamePrefix("springboot-quartz-thread");
        //线程池初始化
        executor.initialize();
        return executor;
    }
}
